# src/scripts/gui.py
import tkinter as tk
from tkinter import ttk, filedialog, messagebox, scrolledtext
import threading
import os
import sys

# 添加项目根目录到模块搜索路径
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
sys.path.insert(0, project_root)

from src.api.openai_api import OpenAIClient
from src.config.settings import API_KEY, BASE_URL
from src.services.question_service import run_processing_pipeline
from src.core.image_utils import process_image
from src.core.file_utils import write_answers_to_word, clean_path

class AIAssistantApp:
    def __init__(self, root):
        self.root = root
        self.root.title("智能助手工具集")
        self.root.geometry("800x600")
        self.root.resizable(True, True)
        
        self.client = OpenAIClient(api_key=API_KEY, base_url=BASE_URL)
        
        self.main_frame = ttk.Frame(root, padding="10")
        self.main_frame.pack(fill=tk.BOTH, expand=True)
        
        self.notebook = ttk.Notebook(self.main_frame)
        self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 修改：将'文档处理'改为更通用的'问答处理'
        self.create_qa_tab() 
        self.create_image_tab()
        self.create_game_tab()
        self.create_log_tab()
        
        self.status_var = tk.StringVar(value="就绪")
        status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)
    
    def create_qa_tab(self):
        """创建问答处理标签页，包含本地文件和网页URL两种模式"""
        tab = ttk.Frame(self.notebook)
        # 修改：标签页标题
        self.notebook.add(tab, text="问答处理")

        # --- 1. 从本地文件处理的功能区 ---
        file_frame = ttk.LabelFrame(tab, text="从本地文件处理", padding="10")
        file_frame.pack(fill=tk.X, padx=10, pady=5)

        ttk.Label(file_frame, text="输入Word文档:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
        self.doc_input_var = tk.StringVar()
        ttk.Entry(file_frame, textvariable=self.doc_input_var, width=60).grid(row=0, column=1, padx=5, pady=5, sticky=tk.EW)
        ttk.Button(file_frame, text="浏览...", command=self.browse_doc_input).grid(row=0, column=2, padx=5, pady=5)
        ttk.Button(file_frame, text="开始处理文件", command=self.process_document).grid(row=1, column=1, pady=10)

        # --- 2. 从网页URL处理的功能区 ---
        web_frame = ttk.LabelFrame(tab, text="从网页URL处理", padding="10")
        web_frame.pack(fill=tk.X, padx=10, pady=5)
        
        ttk.Label(web_frame, text="输入网页URL:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
        self.url_input_var = tk.StringVar()
        ttk.Entry(web_frame, textvariable=self.url_input_var, width=60).grid(row=0, column=1, padx=5, pady=5, sticky=tk.EW)
        ttk.Button(web_frame, text="开始处理网页", command=self.process_webpage).grid(row=1, column=1, pady=10)

        # --- 3. 共享的输出设置区 ---
        output_frame = ttk.LabelFrame(tab, text="输出设置", padding="10")
        output_frame.pack(fill=tk.X, padx=10, pady=15)

        ttk.Label(output_frame, text="输出Word文档:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
        self.doc_output_var = tk.StringVar()
        ttk.Entry(output_frame, textvariable=self.doc_output_var, width=60).grid(row=0, column=1, padx=5, pady=5, sticky=tk.EW)
        ttk.Button(output_frame, text="浏览...", command=self.browse_doc_output).grid(row=0, column=2, padx=5, pady=5)

        # --- 4. 共享的进度条 ---
        self.qa_progress = ttk.Progressbar(tab, orient=tk.HORIZONTAL, length=400, mode='indeterminate')
        self.qa_progress.pack(pady=20, padx=10, fill=tk.X)
        
        # 让内容区自适应窗口宽度
        file_frame.grid_columnconfigure(1, weight=1)
        web_frame.grid_columnconfigure(1, weight=1)
        output_frame.grid_columnconfigure(1, weight=1)

    def _start_processing_thread(self, input_path, output_path):
        """通用的处理线程启动器"""
        self.qa_progress.start(10)
        self.status_var.set(f"正在处理: {os.path.basename(input_path)}...")
        
        def processing_task():
            try:
                run_processing_pipeline(input_path, output_path, self.client)
                self.log_message(f"处理完成, 结果已保存到: {output_path}")
                messagebox.showinfo("完成", "处理已完成！")
            except Exception as e:
                self.log_message(f"处理错误: {str(e)}", error=True)
                messagebox.showerror("错误", f"处理过程中发生错误:\n{e}")
            finally:
                self.qa_progress.stop()
                self.status_var.set("就绪")
        
        threading.Thread(target=processing_task, daemon=True).start()

    def process_document(self):
        """处理本地文档"""
        input_path = clean_path(self.doc_input_var.get())
        output_path = clean_path(self.doc_output_var.get())

        if not input_path or not output_path:
            messagebox.showerror("错误", "请同时选择输入和输出文件路径。")
            return
        
        if not os.path.exists(input_path):
            messagebox.showerror("错误", f"输入文件不存在: {input_path}")
            return
            
        self._start_processing_thread(input_path, output_path)

    def process_webpage(self):
        """处理网页URL"""
        input_url = clean_path(self.url_input_var.get())
        output_path = clean_path(self.doc_output_var.get())

        if not input_url or not output_path:
            messagebox.showerror("错误", "请输入网页URL并选择输出文件路径。")
            return

        if not (input_url.lower().startswith("http://") or input_url.lower().startswith("https://")):
            messagebox.showerror("错误", "请输入一个有效的HTTP或HTTPS开头的URL。")
            return

        self._start_processing_thread(input_url, output_path)
    
    # create_image_tab, create_game_tab 等其他方法保持不变...
    def create_image_tab(self):
        """创建图片处理标签页"""
        tab = ttk.Frame(self.notebook)
        self.notebook.add(tab, text="图片分析")
        
        # 输入图片部分
        ttk.Label(tab, text="输入图片文件:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
        self.img_input_var = tk.StringVar()
        ttk.Entry(tab, textvariable=self.img_input_var, width=50).grid(row=0, column=1, padx=5, pady=5)
        ttk.Button(tab, text="浏览...", command=self.browse_img_input).grid(row=0, column=2, padx=5, pady=5)
        
        # 输出文件部分
        ttk.Label(tab, text="输出Word文档:").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)
        self.img_output_var = tk.StringVar()
        ttk.Entry(tab, textvariable=self.img_output_var, width=50).grid(row=1, column=1, padx=5, pady=5)
        ttk.Button(tab, text="浏览...", command=self.browse_img_output).grid(row=1, column=2, padx=5, pady=5)
        
        # 处理按钮
        ttk.Button(tab, text="开始分析图片", command=self.process_image).grid(row=2, column=1, pady=10)
        
        # 预览区域
        ttk.Label(tab, text="分析结果预览:").grid(row=3, column=0, sticky=tk.W, padx=5, pady=5)
        self.img_preview = scrolledtext.ScrolledText(tab, height=10, width=70)
        self.img_preview.grid(row=4, column=0, columnspan=3, padx=5, pady=5)
        
        # 进度条
        self.img_progress = ttk.Progressbar(tab, orient=tk.HORIZONTAL, length=400, mode='indeterminate')
        self.img_progress.grid(row=5, column=0, columnspan=3, pady=10)
    
    def create_game_tab(self):
        """创建小游戏标签页"""
        tab = ttk.Frame(self.notebook)
        self.notebook.add(tab, text="睿智小游戏")
        
        game_info = """
        欢迎来到最大总人数游戏!
        
        规则说明：
        在这个游戏中，一个关卡由 n 对门组成。每对门包含一个左门和一个右门。
        每个门执行两种操作中的一种：
          - 加法运算(+ a)：将车道上的人数增加一个常数
          - 乘法运算(x a)：将车道上的当前人数乘以一个整数 a
        
        每次操作增加的人数可以分配到任一车道。但是，已在一条车道上的人数不能被移动。
        最初，每个车道上都有一个人。
        
        你的任务是根据最优决策，计算最终能达到的最大总人数。
        """
        ttk.Label(tab, text=game_info, wraplength=550, justify=tk.LEFT).grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)
        
        ttk.Label(tab, text="选择游戏难度:").grid(row=1, column=0, sticky=tk.W, padx=10, pady=5)
        self.difficulty_var = tk.IntVar(value=5)
        ttk.Scale(tab, from_=1, to=10, orient=tk.HORIZONTAL, 
                 length=200, variable=self.difficulty_var).grid(row=1, column=0, padx=100, pady=5)
        
        ttk.Button(tab, text="开始游戏", command=self.start_game).grid(row=2, column=0, pady=15)
        
        self.game_result = ttk.Label(tab, text="", font=("Arial", 14))
        self.game_result.grid(row=3, column=0, pady=10)
    
    def create_log_tab(self):
        """创建日志标签页"""
        tab = ttk.Frame(self.notebook)
        self.notebook.add(tab, text="处理日志")
        
        self.log_text = scrolledtext.ScrolledText(tab, height=20, width=85)
        self.log_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        self.log_text.config(state=tk.DISABLED)
        
        ttk.Button(tab, text="清除日志", command=self.clear_log).pack(pady=10)

    # 浏览文件的辅助函数保持不变
    def browse_doc_input(self):
        file_path = filedialog.askopenfilename(filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")])
        if file_path: self.doc_input_var.set(file_path)
    
    def browse_doc_output(self):
        file_path = filedialog.asksaveasfilename(defaultextension=".docx", filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")])
        if file_path: self.doc_output_var.set(file_path)
    
    def browse_img_input(self):
        file_path = filedialog.askopenfilename(filetypes=[("图片文件", "*.png *.jpg *.jpeg"), ("所有文件", "*.*")])
        if file_path: self.img_input_var.set(file_path)
    
    def browse_img_output(self):
        file_path = filedialog.asksaveasfilename(defaultextension=".docx", filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")])
        if file_path: self.img_output_var.set(file_path)
    
    def process_image(self):
        input_path = clean_path(self.img_input_var.get())
        output_path = clean_path(self.img_output_var.get())
        
        if not input_path or not output_path:
            messagebox.showerror("错误", "请选择输入和输出文件路径")
            return
        if not os.path.exists(input_path):
            messagebox.showerror("错误", "输入文件不存在")
            return
        
        self.img_progress.start(10)
        self.status_var.set("正在分析图片...")
        self.img_preview.delete(1.0, tk.END)
        self.img_preview.insert(tk.END, "正在分析图片，请稍候...")
        
        def img_processing():
            try:
                res = process_image(input_path, self.client)
                write_answers_to_word([res], output_path)
                self.img_preview.delete(1.0, tk.END)
                self.img_preview.insert(tk.END, res)
                self.log_message(f"图片分析完成: {output_path}")
            except Exception as e:
                self.log_message(f"图片分析错误: {str(e)}", error=True)
                self.img_preview.delete(1.0, tk.END)
                self.img_preview.insert(tk.END, f"处理错误: {str(e)}")
            finally:
                self.img_progress.stop()
                self.status_var.set("图片分析完成")
                messagebox.showinfo("完成", "图片分析已完成")
        
        threading.Thread(target=img_processing, daemon=True).start()
    
    def start_game(self):
        from src.scripts.games.睿智小游戏 import main as game_main
        def run_game():
            try:
                self.log_message("开始睿智小游戏...")
                self.status_var.set("游戏进行中...")
                game_main()
                self.log_message("游戏结束")
                self.status_var.set("游戏结束")
            except Exception as e:
                self.log_message(f"游戏错误: {str(e)}", error=True)
        threading.Thread(target=run_game, daemon=True).start()
    
    def log_message(self, message, error=False):
        self.log_text.config(state=tk.NORMAL)
        if error:
            self.log_text.insert(tk.END, f"[错误] {message}\n", "error")
        else:
            self.log_text.insert(tk.END, f"[信息] {message}\n")
        self.log_text.see(tk.END)
        self.log_text.config(state=tk.DISABLED)
    
    def clear_log(self):
        self.log_text.config(state=tk.NORMAL)
        self.log_text.delete(1.0, tk.END)
        self.log_text.config(state=tk.DISABLED)

def main():
    root = tk.Tk()
    app = AIAssistantApp(root)
    app.log_text.tag_config("error", foreground="red")
    root.mainloop()

if __name__ == "__main__":
    main()